"use strict";

const code = require("../errorCode.js");

module.exports = (options) => {
  return async (ctx, next) => {
    //TODO: 建立缓存机制，如果IP地址在token有效期内发生改变，则不允许访问
    if (!options.whitelist.some((item) => item == ctx.request.url)) {
      let token = ctx.request.header.authorization;
      const ipCache = ctx.app.getTokenCache(token)
      if (ipCache.length==0){
        ctx.app.setTokenCache(token, ctx.request.ip)
      }else{
        if(ipCache.ip != ctx.request.ip){
          ctx.body = ctx.app.error(
            code.TOKEN_IP_ERR,
            'token与客户端主机不匹配，请重新登录'
          );
          return
        }
      }
      if (token) {
        try {
          let decode = ctx.app.jwt.verify(token, options.secret);
          
          if (decode && decode.message) {
            ctx.body = ctx.app.error(
              code.TOKEN,
              "token错误，请重新检查: " + decode.message
            );
            return
          } else {
            ctx.request.header.user = {
              id: decode.id,
              organ: decode.organ,
              role: decode.role,
            };
            await next();
          }
        } catch (e) {
          ctx.body = ctx.app.error(
            code.TOKEN,
            "token检查失败: " + e
          );
          return
        }
      } else {
        ctx.body = ctx.app.error(code.TOKEN_ISNULL, "没有token");
        return
      }
    } else {
      await next();
    }
  };
};
